import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.api.java.function.VoidFunction;
import scala.Tuple2;

/**
 * 统计行数
 */
public class LineCount {
    public static void main(String[] args) {
        // 创建 SparkConf
        SparkConf conf = new SparkConf()
                .setAppName("LocalCount")
                .setMaster("local");

        // 创建JavaSparkContext
        JavaSparkContext sc = new JavaSparkContext(conf);

        // 创建初始RDD, lines,每个元素都是一行文本
        JavaRDD<String> lines = sc.textFile("src/main/resources/spark.txt");

        // 对lines RDD 执行 mapToPair 算子， 将每一行映射为 (line, 1)的这种 key-value 对的格式
        // mapToPair 是将数据映射成 key-value 对
        // 然后 后面 才能统计每一行出现的次数
        // new PairFunction<String, Object, Object> 第一个参数 是 input
        // 第二个参数是 key 类型， 第三个参数是 value 类型
        JavaPairRDD<String, Integer> pairs = lines.mapToPair(new PairFunction<String, String, Integer>() {
            @Override
            public Tuple2<String, Integer> call(String s) throws Exception {
                return new Tuple2<String, Integer>(s, 1);
            }
        });

        // 对 pairs RDD执行 reduceByKey 算子， 统计每一行出现的总次数
        JavaPairRDD<String, Integer> lineCounts = pairs.reduceByKey(new Function2<Integer, Integer, Integer>() {
            @Override
            public Integer call(Integer v1, Integer v2) throws Exception {
                return v1 + v2;
            }
        });

        // 执行一个 Action 操作， 打印出每一行出现的次数
        lineCounts.foreach(new VoidFunction<Tuple2<String, Integer>>() {
            @Override
            public void call(Tuple2<String, Integer> t) throws Exception {
                System.out.println(t._1 + " 出现了 " + t._2 +" 次");
            }
        });

        sc.close();
    }
}
